<?php

//模块
define("MOD_新手拼", 1);
define("MOD_四人团", 2);
define("MOD_十人团", 3);
define("MOD_潮玩盲拼", 4);
define("MOD_直接买", 5);
define("MOD_拼团赚", 6);
define("MOD_升价拍", 7);
define("MOD_降价拍", 8);
define("MOD_贝壳竞拍", 9);
define("MOD_暗拍_升", 10);
define("MOD_暗拍_降", 11);
define("MOD_兼职任务", 12);
define("MOD_米市", 13);
define("MOD_米市专享", 14);
define("MOD_扫码付", 15);
define("MOD_众筹_贝壳", 16);
define("MOD_众筹_积分", 17);
define("MOD_广告众筹", 18);



define('ROUND_ER', 2); //小数点保留
define('ROUND_SAN', 3); //小数点保留


//浏览记录
define('GOODS', '1'); //商品
define('NOTICE', '2'); //通知
define('ARTCLE', '3'); //常见问题 文章

define('STORE', '5'); //店铺
define('AUCTION', '6'); //拍卖









define('PAY_WECHAT_OFFICIAL', 3); //微信公众号
define('PAY_WECHAT_H5', 5); //微信h5支付
define('PAY_WECHAT_APP', 6); //微信app支付
define('PAY_WECHAT_MINI', 7); //微信小程序支付
define('PAY_ALIPAY', 7);    //支付宝
// define('PAY_ALIPAY', 8); //
define('PAY_WALLET', 9); //钱包
define('PAY_MIX', 10);  //混合支付



//拍卖定义

define("WS_拍卖列表", 'auction_list');
define("WS_系统大厅", 'system_group');


//钱包状态

define("CODE_店铺认证拒绝退费用", 10);
define("CODE_店铺认证费用", 11);




define("CODE_商品下单", 12);
define("CODE_订单退款", 13);


define("CODE_拍卖", 20);
define("CODE_拍卖出局", 21);

define("CODE_拍卖未成功", 23);

define("CODE_用户提现", 31);
define("CODE_用户充值积分", 33);






define("CODE_用户支付保证金", 51);
define("CODE_用户退保证金", 52);
define("CODE_店铺退保证金", 53);
define("CODE_店铺退活动保证金", 54);

define("CODE_店铺保支付保证金", 15);
define("CODE_店铺保支付活动保证金", 16);
define("CODE_店铺保支付证金", 15);
define("CODE_店铺保支付活动证金", 16);

define("CODE_用户确认收货", 20);


define("CODE_拍卖活动不存在", -101);
define("CODE_该拍卖未通过", -103);
define("CODE_您已报名该拍卖活动", -105);
define("CODE_该拍卖不能报名", -107);
define("CODE_该拍卖非进行中", -109);
define("CODE_该拍卖活动结束", -111);
define("CODE_低于当前拍卖价", -113);
define("CODE_超过限高价", -115);





define("CODE_请上传视频封面", -501);


define("CODE_请先实名认证", -601);
define("CODE_身份证号错误", -602);
define("CODE_手机号错误", -603);
define("CODE_手机号已有用户存在", -604);


define("CODE_请传入考试ID", -620);
define("CODE_考试不存在", -621);
define("CODE_考试未通过", -622);


define("CODE_主营分类参数错误", -650);
define("CODE_个人店铺主营分类限制", -651);
define("CODE_企业店铺主营分类限制", -652);

define("CODE_非店铺", -655);

define("CODE_您没有上传该商品分类资格", -662);


define("CODE_该地址不存在", -676);



define("CODE_用户支付密码错误", -703);
define("CODE_店铺支付密码错误", -803);


define("CODE_该商品不存在", -850);
define("CODE_该商品已下架", -851);
define("CODE_暂无该规格", -853);

define("CODE_库存不足", -855);
define("CODE_该规格已下架", -856);



define("CODE_店铺认证时间到期", -900);

define("CODE_店铺保证金不足", -902);
define("CODE_店铺活动保证金不足", -903);

define("CODE_店铺网盘储存不足", -911);


define("CODE_保证金不足", -1000);
define("CODE_积分不足", -1001);
define("CODE_贝壳不足", -1002);
define("CODE_余额不足", -1003);
define("CODE_超过可使用积分", -1006);
define("CODE_超过可使用贝壳", -1007);

define("CODE_店铺余额不足", -1008);


define("CODE_含有违禁词", -10000);








if (!function_exists('getControllerFiles')) {
    /**
     * 获取所有控制器
     * @param $path
     * @param $files
     */
    function getControllerFiles($path, &$files)
    {
        if (is_dir($path)) {
            $dp = dir($path);
            while ($file = $dp->read()) {
                if ($file !== "." && $file !== "..") {
                    getControllerFiles($path . "/" . $file, $files);
                }
            }
            $dp->close();
        }
        if (is_file($path) && str_contains($path, 'Controller.php')) {
            $content = file_get_contents($path);
            if (str_contains($content, '@Controller(')) {
                preg_match('!namespace (.*?);!i', $content, $namespace);
                preg_match('!class (.*?) extends!i', $content, $class);
                if ($namespace && $class) {
                    $namespace = str_replace(['namespace ', ';'], '', $namespace[0]);
                    $class = str_replace(['class ', ' extends'], '', $class[0]);
                    $files[] = str_replace("\\", "\\", $namespace) . "\\" . $class;
                }
            }
        }
    }
}


if (!function_exists('getModelFiles')) {
    /**
     * 获取所有模型
     * @param $path
     * @param $files
     */
    function getModelFiles($path, &$files)
    {
        if (is_dir($path)) {
            $dp = dir($path);
            while ($file = $dp->read()) {
                if ($file !== "." && $file !== "..") {
                    getModelFiles($path . "/" . $file, $files);
                }
            }
            $dp->close();
        }
        if (is_file($path) && str_contains($path, '.php')) {
            $content = file_get_contents($path);
            if (str_contains($content, 'Model\\Base') && str_contains($content, 'Annotation\\Inherit')) {
                preg_match('!namespace (.*?);!i', $content, $namespace);
                preg_match('!class (.*?) extends!i', $content, $class);
                if ($namespace && $class) {
                    $namespace = str_replace(['namespace ', ';'], '', $namespace[0]);
                    $class = str_replace(['class ', ' extends'], '', $class[0]);
                    $files[] = str_replace("\\", "\\", $namespace) . "\\" . $class;
                }
            }
        }
    }
}

if (!function_exists('sendEmail')) {
    /**
     * 邮件发送
     * @param $subjuct
     * @param $content
     * @param $address
     * @throws \PHPMailer\PHPMailer\Exception
     */
    function sendEmail($subjuct, $content, $address)
    {
        go(function () use ($subjuct, $content, $address) {
            $mail = new \PHPMailer\PHPMailer\PHPMailer; //PHPMailer对象
            $mail->CharSet = 'UTF-8'; //设定邮件编码，默认ISO-8859-1，如果发中文此项必须设置，否则乱码
            $mail->IsSMTP(); // 设定使用SMTP服务
            $mail->SMTPDebug = 0; // 关闭SMTP调试功能
            $mail->SMTPAuth = true; // 启用 SMTP 验证功能
            $mail->SMTPSecure = config('mail_vertify') == "1" ? 'tls' : 'ssl'; // 使用安全协议
            $mail->Host = config('mail_host'); // SMTP 服务器
            $mail->Port = config('mail_port'); // SMTP服务器的端口号
            $mail->Username = config('mail_user'); // SMTP服务器用户名
            $mail->Password = config('mail_pass'); // SMTP服务器密码
            $mail->SetFrom(config('mail_from'), config('mail_name')); // 邮箱，昵称
            $mail->Subject = $subjuct;
            $mail->MsgHTML($content);
            $mail->AddAddress($address);
            $result = $mail->Send();
            if (!$result) {
                \Imi\Log\Log::error($mail->ErrorInfo);
            }
        });
    }
}


if (!function_exists('build_timestamp')) {
    /**
     * 生成时间戳
     * @param string $a
     * @return array
     */
    function build_timestamp(string $a = 'today'): array
    {
        $array = [];
        $a == 'today' && $array = [strtotime(date("Y-m-d", time()) . ' 00:00:00'), strtotime(date("Y-m-d", time()) . ' 23:59:59')];
        $a == 'yesterday' && $array = [strtotime(date("Y-m-d", strtotime("-1 day")) . ' 00:00:00'), strtotime(date("Y-m-d", strtotime("-1 day")) . ' 23:59:59')];
        $a == 'week' && $array = [strtotime(date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), (int)(date("d") - date("w")) + 1, date("Y")))), strtotime(date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), (int)(date("d") - date("w")) + 7, date("Y"))))];
        $a == 'lastweek' && $array = [strtotime(date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), (int)(date("d") - date("w")) + 1 - 7, date("Y")))), strtotime(date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), (int)(date("d") - date("w")) + 7 - 7, date("Y"))))];
        $a == 'month' && $array = [strtotime(date("Y-m-d H:i:s", mktime(0, 0, 0, date("m"), 1, date("Y")))), strtotime(date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), date("t"), date("Y"))))];
        $a == 'lastmonth' && $array = [strtotime(date("Y-m-d H:i:s", mktime(0, 0, 0, date("m") - 1, 1, date("Y")))), strtotime(date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), 0, date("Y"))))];
        $a == 'quarter' && $array = [strtotime(date('Y-m-d H:i:s', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3, 1, date('Y')))), strtotime(date('Y-m-d H:i:s', mktime(23, 59, 59, (int)date('n') + (date('n') - 1) % 3, date("t", mktime(0, 0, 0, (int)date('n') + (date('n') - 1) % 3, 1, date("Y"))), date('Y'))))];
        $a == 'lastquarter' && $array = [strtotime(date('Y-m-01', mktime(0, 0, 0, ((ceil(date('n') / 3)) - 2) * 3 + 1, 1, date('Y')))), strtotime(date('Y-m-t', mktime(0, 0, 0, ((ceil(date('n') / 3)) - 1) * 3, 1, date('Y'))))];
        return $array;
    }
}


if (!function_exists('build_url')) {
    /**
     * url转换
     * @param string $url Url字符
     * @param string $ends 后缀
     * @return string
     */
    function build_url(string $url = '', string $ends = '/'): string
    {
        if (preg_match("/^(http:\/\/|https:\/\/).*$/", $url)) {
            if (str_starts_with($url, "http://")) $h = true;
            if (str_starts_with($url, 'https://')) $h = true;
        }
        if (!isset($h)) $url = 'http://' . $url;
        $url = trim($url);
        $url = trim($url, '/');
        return $url . $ends;
    }
}


if (!function_exists("is_mobile")) {
    /**
     * 检测是否为手机
     * @return bool
     */
    function is_mobile(): bool
    {
        $request = new \ImiApp\ImiServer\Request();
        $match_rule = '/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i';
        if ($request->hasHeader('HTTP_VIA') && stristr($request->getHeaderLine('HTTP_VIA'), "wap")) {
            return true;
        } elseif ($request->hasHeader('HTTP_ACCEPT') && strpos(strtoupper($request->getHeaderLine('HTTP_ACCEPT')), "VND.WAP.WML")) {
            return true;
        } elseif ($request->hasHeader('HTTP_X_WAP_PROFILE') || $request->hasHeader('HTTP_PROFILE')) {
            return true;
        } elseif ($request->hasHeader('HTTP_USER_AGENT') && preg_match($match_rule, $request->getHeaderLine('HTTP_USER_AGENT'))) {
            return true;
        } elseif ($request->hasHeader('USER-AGENT') && preg_match($match_rule, $request->getHeaderLine('USER-AGENT'))) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('camelize')) {
    /**
     * 下划线转驼峰
     * @param string $uncamelized_words
     * @param string $separator
     * @return string
     */
    function camelize(string $uncamelized_words, string $separator = '_'): string
    {
        $uncamelized_words = $separator . str_replace($separator, " ", strtolower($uncamelized_words));
        return ucwords(ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator));
    }
}

if (!function_exists("build_url_string")) {
    /**
     * 一纬数组转换生成Url字符串
     * @param array $array 数组
     */
    function build_url_string(array $array, array $un = ['sign', 'sign_type', 'openid']): string
    {
        $data = [];
        foreach ($array as $k => $v) {
            if (!in_array($k, $un) && $v !== "") {
                $data[$k] = $v;
            }
        }
        ksort($data);
        reset($data);
        $url_string = '';
        foreach ($data as $k => $v) {
            $url_string .= $k . '=' . $v . '&';
        }
        return rtrim($url_string, '&');
    }
}





if (!function_exists('get_field_arr')) {

    /**
     * 获取字段数组（可处理时间戳）
     *
     * @param array $arr 数组
     * @param array|string $fields 需要的字段
     * @param boolean $time 是否转化时间戳
     * @return void
     */
    function get_field_arr($arr, $fields, $time = false)
    {
        if (!is_array($fields)) {
            //字符串
            $fields = explode(',', $fields);
        }
        // //如果传入市 没有传省id
        // if (isset($arr['city_id'])) {
        //     if (!empty($arr['city_id']) && (isset($arr['province_id']) && empty($arr['province_id'])) || !isset($arr['province_id'])) {
        //         $arr['province_id'] = Db::name('area')->where('id', $arr['city_id'])->value('pid');
        //     }
        // }

        $new = array();
        foreach ($fields as $key => $val) {
            if (isset($arr[$val])) {
                //字段后缀未time的可转时间戳
                if ($time && strlen($val) > 3 && substr($val, -4) == 'time') {

                    $new[$val] = strtotime($arr[$val]);
                } else {
                    $new[$val] = $arr[$val];
                }
            }
        }
        return $new;
    }
}


if (!function_exists('xss_clean')) {
    /**
     * 清理XSS
     */
    function xss_clean($content, $is_image = false)
    {
        return \ImiApp\ApiServer\Common\Security::instance()->xss_clean($content, $is_image);
    }
}

if (!function_exists('rand_order')) {

    function rand_order($prefix = 'O', $user_id = 0, $long = 22)
    {
        // var_dump($long);

        // $rand = $user_id < 999 ? mt_rand(100, 999) : mt_rand(100, 999);
        // $order_sn =$prefix. date('Ydhis') . $rand;
        // $id = str_pad($user_id, ($long - strlen($order_sn)), '0', STR_PAD_BOTH);
        // return $order_sn . $id;


        // $user_id = $user_id < 99999 ? mt_rand(10000, 999) : mt_rand(100, 999);
        // $order_sn =$prefix.$user_id. date('Ydhis');

        // if($long > strlen($order_sn)){
        //     // var_dump($long - strlen($order_sn));
        //  for ($i=0; $i < ($long - strlen($order_sn)); $i++) { 
        //     $order_sn  .= mt_rand(0, 9);
        //  }

        // }
        // return $order_sn ;



        if ($long < 25) {
            // 方法3
            $timestamp = microtime(true) * 10000;
            $order_sn = $prefix . dechex($user_id) . dechex($timestamp) . mt_rand(0, 99999); // 使用当前时间作为订单号的前缀
            return $order_sn;
        } else {
            //方法2
            // $userId = $user_id;
            // // $userId = str_pad($user_id, 7, '0', STR_PAD_LEFT); // 将用户ID填充为7位，不足的部分用0填充

            // // 生成一个唯一的时间戳
            $timestamp = microtime(true) * 10000;
            $timestamp  = substr($timestamp, 10, 3);

            $time = substr(date('Y'), -2) . date('ndHis') . $timestamp;
            // // 生成一个随机数
            $random = mt_rand(0, 99999);
            // $random = str_pad($random, 4, '0', STR_PAD_LEFT); // 将随机数填充为4位，不足的部分用0填充

            // // 拼接订单号
            $order_sn = $prefix . dechex($user_id) . $time . $timestamp;
            if (($long - strlen($order_sn)) > 0) {

                $random = mt_rand(0, intval(pow($long - strlen($order_sn) - 1, 10) * 0.99999));
                $order_sn =  $order_sn . $random;
            }

            return $order_sn;
        }
    }
}
